/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DTD.Validador;

import DTD.Diccionario.Diccionario;
import DTD.Diccionario.IDiccionario;
import Utilidades.AtributoEtiqueta;
import Utilidades.StrOp;
import Utilidades.VerificadorStrings;

/**
 *
 * @author Administrador
 */
public class ValidadorAtributo {

    private Diccionario diccionario;

    public ValidadorAtributo() {
        diccionario = new Diccionario();
    }

    public boolean validar(String regla, AtributoEtiqueta valorAtributo) {
        boolean resultado = true;
        String tipoDato = StrOp.separar(regla, " ", "", "", '(', ')')[1];

        if (diccionario.getTipoDiccionario(tipoDato) == IDiccionario.DATA_TYPE) {
            resultado = checkTipoDato(tipoDato, valorAtributo);
        }
        else {
            resultado = checkValoresDefault(tipoDato, valorAtributo);
        }
        return resultado;
    }

    private boolean checkTipoDato(String tipoDato, AtributoEtiqueta valorAtributo) {
        boolean resultado = false;

        if (tipoDato.equals("#PCDATA") || tipoDato.equals("ID") || tipoDato.equals("IDREFS")) {
            resultado = VerificadorStrings.soloTextosYGuiones(valorAtributo.getValor());
        }
        else if (tipoDato.equals("CDATA")) {
            resultado = true;
        }
        else if (tipoDato.equals("NMTOKEN")) {
            resultado = VerificadorStrings.soloTextosYGuiones(valorAtributo.getValor());
            if (resultado == false) {
                resultado = tieneSimbolo(valorAtributo.getValor(), ":.");
            }
        }
        return resultado;
    }

    private boolean checkValoresDefault(String tipoDato, AtributoEtiqueta valorAtributo) {
        boolean resultado = false;
        String[] posiblesValores = tipoDato.substring(1, tipoDato.length() - 1).split("[|]");

        for (int i = 0; i < posiblesValores.length && resultado == false; i++) {
            String aux = posiblesValores[i];
            resultado = (aux.equals(valorAtributo.getValor()));
        }
        return resultado;
    }

    private boolean tieneSimbolo(String valor, String aBuscar) {
        char[] chValor = valor.toCharArray();
        char[] chBuscar = aBuscar.toCharArray();
        boolean resultado = false;

        for (int i = 0; !resultado && i < chBuscar.length; i++) {
            char tf = chBuscar[i];
            for (int j = 0; !resultado && j < chValor.length; j++) {
                char v = chBuscar[j];
                if (v == tf) {
                    resultado = true;
                }
            }
        }
        return resultado;
    }

}
